package bsh.meta;

import org.objectweb.asm.MethodVisitor;

import bsh.CompilationState;

/**
 * Descritor para um campo
 * 
 * @author takeshi
 */
public interface FieldDescriptor {

    /**
     * Nome do campo
     * 
     * @return String
     */
    String fieldName();

    /**
     * Tipo que declara este campo
     * 
     * @return {@link TypeWrapper}
     */
    TypeWrapper declaringType();

    /**
     * Tipo do campo
     * 
     * @return {@link TypeWrapper}
     */
    TypeWrapper fieldType();

    /**
     * @return int
     */
    int asmModifiers();

    /**
     * Escreve o bytecode para pegar o valor do field
     * 
     * @param visitor {@link MethodVisitor}
     * @param state {@link CompilationState}
     */
    void writeGetValueCode(MethodVisitor visitor, CompilationState state);

    /**
     * Escreve o bytecode para escrever no field
     * 
     * @param visitor {@link MethodVisitor}
     * @param state {@link CompilationState}
     */
    void writeWriteValueCode(MethodVisitor visitor, CompilationState state);

    /**
     * @return true se este campo for estatico
     */
    boolean isStatic();

}
